package com.gulimall.product.exception;

import com.common.exception.BizCodeEnum;
import com.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.validation.UnexpectedTypeException;
import java.util.HashMap;


/**
 * @Author: Ren(任佳宝)
 * @Description: ExceptionControllerAdvice
 * @Date: 2025/1/7 下午12:34
 * @Version: 1.0
 * <p>
 * 集中处理所有异常
 */
// basePackages = "com.gulimall.product.controller"
// 处理  "com.gulimall.product.controller" 所产生的异常信息
@RestControllerAdvice(basePackages = "com.gulimall.product.controller")
@Slf4j
public class ExceptionControllerAdvice {
    // todo: 异常返回的代码换成枚举类型
    @ExceptionHandler(value = {MethodArgumentNotValidException.class})
    public R handerVaildException(MethodArgumentNotValidException e) {

        log.error("数据校验出现问题：{},异常类型：{}", e.getMessage(), e.getClass());

        HashMap<String, String> errorMap = new HashMap<>();
        BindingResult bindingResult = e.getBindingResult();

        bindingResult.getFieldErrors().forEach((fieldError) -> {
            String defaultMessage = fieldError.getDefaultMessage();
            String field = fieldError.getField();
            errorMap.put(field, defaultMessage);
        });

        return R.error(BizCodeEnum.VALID_EXCEPTION.getCode(), BizCodeEnum.VALID_EXCEPTION.getMsg())
                .put("data", errorMap);
    }

    /**
     * 最大范围异常
     *
     * @param e 异常信息
     * @return 返回异常信息
     */
    @ExceptionHandler(value = Throwable.class)
    public R handerException(Throwable e) {

        log.error("发生异常：{},异常类型：{}", e.getCause(), e.getClass(), e);
        return R.error().put("data", e.getMessage());
    }
}
